#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>

using namespace std;

template <class T>
class Stack {
private:
	vector<T> elems;// 元素 

public:
	// 入栈
	void push(T const&);
	// 出栈
	void pop();
	// 返回栈顶元素
	T top() const;
	// 如果为空则返回真。
	bool empty() const {
		return elems.empty();
	}
};

template <class T>
void Stack<T>::push(T const& elem)
{
	// 追加传入元素的副本
	elems.push_back(elem);
}

template <class T>
void Stack<T>::pop()
{
	if (elems.empty()) {
		throw out_of_range("Stack<>::pop(): empty stack");
	}
	// 删除最后一个元素
	elems.pop_back();
}

template <class T>
T Stack<T>::top() const
{
	if (elems.empty()) {
		throw out_of_range("Stack<>::top(): empty stack");
	}
	// 返回最后一个元素的副本 
	return elems.back();
}
//int main(int argc, char *argv[]) {
//	// int 类型的栈 
//	Stack<int> intStack;
//	// string 类型的栈 
//	Stack<string> stringStack;
//
//	intStack.push(7);
//	cout << intStack.top() << endl;
//
//	// 操作 string 类型的栈 
//	stringStack.push("hello");
//	cout << stringStack.top() << std::endl;
//	stringStack.pop();
//	stringStack.pop();
//	return 0;
//}